オプティマイザが表を結合する順序を指定します。文字列は、カンマではなく空白で区切られた相関名のリストで、問合せまたは副問合せで参照されます。最初に表示されている表が、計画によって最初にスキャンされます(たとえば、ネステッド・ループ結合では一番外側になります)。相関名は、修飾された表名のショートカットまたは別名です。
ttOptSetOrderには、次の必須のパラメータがあります。
パラメータ | データ型 | 説明 |
joinOrder | Varchar(1024) |
空白で区切られた表相関名のリスト。表名を区別するために所有者が必要な場合は、表相関名を使用します。joinOrderを指定しない場合、問合せオプティマイザの動作はデフォルトに戻ります。 |
ttOptSetOrderは結果を返しません。
アプリケーションが次のコールを実行するとします。
call ttOptSetOrder('ORDERS CUSTOMERS');オプティマイザは、1つ以上の未出荷注文を持つすべての顧客を表示する次の問合せを評価する際に、CUSTOMERSをスキャンする前に、ORDERS表をスキャンします。
SELECT CUSTOMERS.NAME FROM CUSTOMERS WHERE EXISTS (SELECT 1 FROM ORDERS WHERE CUSTOMERS.ID = ORDERS.CUSTID AND ORDER.STATUS ='UN-SHIPPED');
文字列の長さは1,024バイトに制限されています。文字列がこの長さを超えると、切り捨てられ、警告が発行されます。
副問合せで参照される相関名が結合順序に含まれていると、TimesTenでは、内部的に分離モードに切り替えられます。
コマンドが準備されている場合は、現在のオプティマイザ・フラグ、索引ヒントおよび結合順序はコマンドのコンパイル済形式の構造で保持され、システムによってそのコマンドが再準備されるときに使用されます。再準備された文の例については、TimesTenの開発者ガイドのTimesTen問合せオプティマイザの章を参照してください。
このコールによって加えられた変更はただちに有効になり、現在のトランザクションでのODBC関数SQLPrepareまたはJDBCメソッドConnection.prepareCallへの後続のすべてのコールに影響します。
結合順序を使用する場合、問合せによって参照される表の名前は、指定した名前と厳密に一致している必要があります(比較では大文字と小文字が区別されません)。完全な順序を指定する必要があります。部分的な順序を指定するメカニズムはありません。問合せに副問合せがある場合、結合順序は副問合せの中の相関名も参照する必要があります。つまり、結合順序は問合せの中のすべての相関名を参照する必要があります。TimesTenオプティマイザは、GROUP BYを使用して、特別な種類の結合問合せとして副問合せを内部的に実装します。結合順序を適用可能にするには、すべての相関名を参照する必要があります。矛盾がある場合は警告が発行され、指定した結合順序は完全に無視されます。次に例を示します。
アプリケーションが次のコールを実行するとします。
ttOptSetOrder('DEPTS EMPS ACCTS');オプティマイザは、特定のアカウントで働いている従業員の数を評価する際に、DEPTSとACCTSの間で結合を実行することはできません。
SELECT COUNT(DISTINCT EMPS.ID) FROM ACCTS, DEPTS, EMPS WHERE ACCTS.DEPTS = DEPTS.ID AND EMPS.DEPTS = DEPTS.ID AND ACCTS.NUM = :AcctNumアプリケーションで、結合順序をリセットせずに、3つの各表を参照しないコマンドを準備しようとすると、オプティマイザによって警告番号965が発行されます。指定した結合順序は適用されません。TimesTenでは、コマンドが準備される際、有効な結合順序が考慮され、指定した結合順序は無視されます。
ttLogBufPrint
ttOptEstimateStats
ttOptGetFlag
ttOptGetOrder
ttOptSetColIntvlStats
ttOptSetFlag
ttOptSetTblStats
ttOptUpdateStats
ttOptUseIndex